package br.com.monise.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;
import java.util.logging.Logger;

import br.com.monise.model.Avaliacao;

public class Kmeans {

	private Logger log;

	public Kmeans(Logger log) {
		this.log = log;
	}

	public Avaliacao gerarClusters(List<Avaliacao> avaliacoes) {

		List<Avaliacao> clusterAvaliacaoSimulada1 = new ArrayList<Avaliacao>();
		List<Avaliacao> clusterAvaliacaoSimulada2 = new ArrayList<Avaliacao>();

		Centroide cluster1 = new Centroide(log);
		Centroide cluster2 = new Centroide(log);

		Vector<Double> v1 = new Vector<Double>();
		v1.add(Double.valueOf(avaliacoes.get(0).getFacilidadeUso()));
		v1.add(Double.valueOf(avaliacoes.get(0).getPeso()));
		v1.add(Double.valueOf(avaliacoes.get(0).getQualidadeTecnica()));
		v1.add(Double.valueOf(avaliacoes.get(0).getRelevanciaAprendizagem()));
		cluster1.setCentroide(v1);

		Vector<Double> v2 = new Vector<Double>();
		v2.add(Double.valueOf(avaliacoes.get(1).getFacilidadeUso()));
		v2.add(Double.valueOf(avaliacoes.get(1).getPeso()));
		v2.add(Double.valueOf(avaliacoes.get(1).getQualidadeTecnica()));
		v2.add(Double.valueOf(avaliacoes.get(1).getRelevanciaAprendizagem()));
		cluster2.setCentroide(v2);

		for (int i = 0; i < avaliacoes.size(); i++) {

			Vector<Double> vetor = new Vector<Double>();
			vetor.add(Double.valueOf(avaliacoes.get(i).getFacilidadeUso()));
			vetor.add(Double.valueOf(avaliacoes.get(i).getPeso()));
			vetor.add(Double.valueOf(avaliacoes.get(i).getQualidadeTecnica()));
			vetor.add(Double.valueOf(avaliacoes.get(i)
					.getRelevanciaAprendizagem()));

			double distancia1 = cluster1.distancia(vetor);
			double distancia2 = cluster2.distancia(vetor);

			if (distancia1 > distancia2) {
				cluster1.recalcularCentro(vetor);

				if (avaliacoes.get(i).getFlagRealSimulado() == 1) {
					clusterAvaliacaoSimulada1.add(avaliacoes.get(i));
				}

			} else {
				cluster2.recalcularCentro(vetor);

				if (avaliacoes.get(i).getFlagRealSimulado() == 1) {
					clusterAvaliacaoSimulada2.add(avaliacoes.get(i));
				}
			}

		}

		if (clusterAvaliacaoSimulada1.size() > clusterAvaliacaoSimulada2.size()) {
			return getAvaliacaoEscolhida(clusterAvaliacaoSimulada1);
		} else {
			return getAvaliacaoEscolhida(clusterAvaliacaoSimulada2);
		}
	}

	private Avaliacao getAvaliacaoEscolhida(List<Avaliacao> avaliacoes) {
		Random gerador = new Random();
		int index = gerador.nextInt(avaliacoes.size());
		return avaliacoes.get(index);
	}

}
